/*
 * Termino.cpp
 *
 *  Created on: 21/05/2013
 *      Author: jonathan
 */

#include "Termino.h"
#include "../../commons/InfoRepositorioActual.h"
#include <cmath>
using namespace std;

Termino::Termino(){
	this->documentos = NULL;
}

Termino::Termino(list<Documento*>* docs, string cars) {
    this->documentos = docs;
    this->caracteres = cars;
}


//lo voy a manejar asi, los documentos son del termino.
Termino::~Termino() {
	list<Documento*>::iterator it;
	if(this->documentos != NULL){
		for(it = this->documentos->begin(); it!= this->documentos->end(); ++it){
			delete *it;
		}
	}
	delete this->documentos;
}

list<Documento*> *Termino::getDocumentos() {
	return this->documentos;
}

void Termino:: addDocumento(Documento * doc){
	if(this->documentos == NULL){
		this->documentos = new list<Documento*>();
	}
	this->documentos->push_back(doc);
}

string Termino::getCaracteres() {
	return this->caracteres;
}

void Termino::setCaracteres(string caracteres) {
	this->caracteres = caracteres;
}

//template method
EnteroLargo Termino::getB(){
    float cantidadArchivos = InfoRepositorioActual::Instance()->getCantidadArchivos();
    if(cantidadArchivos == 0){
    	throw exception();
    }


    float size = this->getCantArchivos();
    //SI EL TERMINO APARECE EN TODOS LOS DOCUMENTOS SE PUDRE XP

    float p = size/ cantidadArchivos;

    if(p== 0){
    	throw exception();
    }

    EnteroLargo  bEntero;
    if (p==1) {
        bEntero = 1;
    }
    else {
        double bDouble = log2(2-p) / (- log2(1-p));
        bEntero = ceil (bDouble);
    }


	return bEntero == 0 ? 1: bEntero;
}




float Termino::getCantArchivos(){
	return documentos->size();
}
void Termino::setDocumentos(list<Documento*> *docs){
	if(this->documentos != NULL){
		delete (this->documentos);
	}
	this->documentos = docs;
}
